//
//  FFBindDefine.h
//  FFMVVM
//
//  Created by AKsoftware on 2016/11/2.
//  Copyright © 2016年 AKsoftware. All rights reserved.
//

#ifndef FFBindDefine_h
#define FFBindDefine_h

#import "FFBindUnit.h"
#import "FFKVOBindSendCenter.h"
#import "NSObject+FFBind.h"

#define FFKeypath(INDEX, fromTarget, key)\
key1 = @keypath(fromTarget, key);\
[keyArray addObject:key1];

/*
   用KVO来绑定，当 fromTarget 的 多个key 发生变化，
   会自动 在主线程 赋值给 toTarget 的 tokey。
 */
#define FFKVOBind_M_I(toTarget,toKey,fromTarget, ...)\
({\
__weak typeof(toTarget) weakToTarget = toTarget;\
NSString *realTokey = @keypath(toTarget, toKey);\
void (^blk)(NSString *key, id value) = ^(NSString *key, id value){\
[weakToTarget setValue:value forKey:realTokey];\
};\
FFKVOBind_M_B(blk, fromTarget, __VA_ARGS__);\
})

/*
   用KVO来绑定，当 fromTarget 的 多个key 发生变化，
   会自动 当前线程 赋值给 toTarget 的 tokey。
 */
#define FFKVOBind_C_I(toTarget,toKey,fromTarget, ...)\
({\
__weak typeof(toTarget) weakToTarget = toTarget;\
NSString *realTokey = @keypath(toTarget, toKey);\
void (^blk)(NSString *key, id value) = ^(NSString *key, id value){\
[weakToTarget setValue:value forKey:realTokey];\
};\
FFKVOBind_C_B(blk, fromTarget, __VA_ARGS__);\
})

/*
   用KVO来绑定，当 fromTarget 的 多个key 发生变化，
   会自动 主线程 执行block
 */
#define FFKVOBind_M_B(block,fromTarget, ...)\
FFKVOBind_Q(block, fromTarget, dispatch_get_main_queue(), __VA_ARGS__);\


/*
   用KVO来绑定，当 fromTarget 的 多个key 发生变化，
   会自动 当前线程 执行block
 */
#define FFKVOBind_C_B(block, fromTarget, ...)\
FFKVOBind_Q(block, fromTarget, nil, __VA_ARGS__);\


/*
   用KVO来绑定，当 fromTarget 的 多个key 发生变化，
   会自动 在指定queue中做处理
 */
#define FFKVOBind_Q(block, fromTarget,QUEUE, ...)\
({\
NSString *key1;\
NSMutableArray *keyArray = [[NSMutableArray alloc] init];\
metamacro_foreach_cxt(FFKeypath,, fromTarget, __VA_ARGS__)\
[fromTarget addBindObserver:self forkeyPathArray:keyArray options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld performQueue:QUEUE performBlock:block];\
})

/*
   用KVO来绑定，当 fromTarget 的 多个key 发生变化，
   会自动 在指定线程中做处理
 */
#define FFKVOBind_T(block, fromTarget,THREAD, ...)\
({\
NSString *key1;\
NSMutableArray *keyArray = [[NSMutableArray alloc] init];\
metamacro_foreach_cxt(FFKeypath,, fromTarget, __VA_ARGS__)\
[fromTarget addBindObserver:self forkeyPathArray:keyArray options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld performThread:thread performBlock:block];\
})

/*
    解除当前对象观察的fromTarget的链接
 */
#define FFRemoveBind(fromTarget)\
[self removeBindTarget:fromTarget]

/*
    解除toTarget观察的当前对象的链接
 */

#define FFRemoveBinded(toTarget)\
[self removeBindObserver:toTarget]

/*
 解除当前对象观察的所有对象的链接
 */

#define removeAllBind()\
[self removeAllBindTarget];

#endif /* FFBindDefine_h */
